<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <title>Spring  &middot; sitename</title>
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1">


<meta name="description" content="" />

<meta name="keywords" content="one, two, ">


<meta property="og:title" content="Spring  &middot; sitename ">
<meta property="og:site_name" content="sitename"/>
<meta property="og:url" content="https://lvzongcheng.gitee.io/framework/spring/" />
<meta property="og:locale" content="en-EN">


<meta property="og:type" content="article" />
<meta property="og:description" content=""/>
<meta property="og:article:published_time" content="2017-12-14T00:00:00Z" />
<meta property="og:article:modified_time" content="2017-12-14T00:00:00Z" />

  
    
<meta property="og:article:tag" content="one">
    
<meta property="og:article:tag" content="two">
    
  

  

<script type="application/ld+json">
  {
    "@context": "http://schema.org",
    "@type": "Article",
    "headline": "Spring",
    "author": {
      "@type": "Person",
      "name": "LvZongCheng"
    },
    "datePublished": "2017-12-14",
    "description": "",
    "wordCount":  566 
  }
</script>



<link rel="canonical" href="https://lvzongcheng.gitee.io/framework/spring/" />

<link rel="apple-touch-icon-precomposed" sizes="144x144" href="https://lvzongcheng.gitee.io/touch-icon-144-precomposed.png">
<link href="https://lvzongcheng.gitee.io/favicon.png" rel="icon">

<meta name="generator" content="Hugo 0.60.0" />

  <!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->

<link href='https://fonts.googleapis.com/css?family=Merriweather:300%7CRaleway%7COpen+Sans' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="/css/font-awesome.min.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/css/highlight/default.css">

  
  
	<script>
	  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
	  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
	  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
	  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

	  ga('create', 'Your Google Analytics tracking code', 'auto');
	  ga('send', 'pageview');

	</script>

</head>
<body>
  <main id="main-wrapper" class="container main_wrapper has-sidebar">
    <header id="main-header" class="container main_header">
  <div class="container brand">
  <div class="container title h1-like">
  <a class="baselink" href="https://lvzongcheng.gitee.io">
  LvZongCheng

</a>

</div>

  
<div class="container topline">
  
  淡定 执著 进取 自律


</div>


</div>

  <nav class="container nav primary no-print">
  

<a class="homelink" href="https://lvzongcheng.gitee.io">home</a>


  
<a href="https://lvzongcheng.gitee.io/framework" title="Show list of Frameworks">Frameworks</a>

<a href="https://lvzongcheng.gitee.io/java" title="Show list of Java">Java</a>

<a href="https://lvzongcheng.gitee.io/linux" title="Show list of Linux">Linux</a>

<a href="https://lvzongcheng.gitee.io/redis" title="Show list of Redis">Redis</a>

<a href="https://lvzongcheng.gitee.io/sql" title="Show list of SQL">SQL</a>

<a href="https://lvzongcheng.gitee.io/Spring" title="Show list of Spring">Spring</a>

<a href="https://lvzongcheng.gitee.io/tools" title="Show list of Tools">Tools</a>

<a href="https://lvzongcheng.gitee.io/webpage" title="Show list of WebPage">WebPage</a>

<a href="https://lvzongcheng.gitee.io/information" title="Show list of information">information</a>

<a href="https://lvzongcheng.gitee.io/network" title="Show list of network">network</a>

<a href="https://lvzongcheng.gitee.io/%E5%BE%AE%E6%9C%8D%E5%8A%A1" title="Show list of 微服务">微服务</a>

<a href="https://lvzongcheng.gitee.io/%E6%80%BB%E7%BB%93" title="Show list of 总结">总结</a>

<a href="https://lvzongcheng.gitee.io/%E6%9C%BA%E5%99%A8%E8%87%AA%E5%8A%A8%E5%8C%96" title="Show list of 机器自动化">机器自动化</a>

<a href="https://lvzongcheng.gitee.io/%E6%B1%87%E7%BC%96" title="Show list of 汇编">汇编</a>

<a href="https://lvzongcheng.gitee.io/%E8%AE%B0%E4%BA%8B%E6%9C%AC" title="Show list of 记事本">记事本</a>


</nav>

<div class="container nav secondary no-print">
  
<a id="contact-link-email" class="contact_link" rel="me" aria-label="Email" href="mailto:Lyc19880405@163.com">
  <span class="fa fa-envelope-square"></span></a>



<a id="contact-link-github" class="contact_link" rel="me" aria-label="Github" href="https://github.com/enten/hugo-boilerplate">
  <span class="fa fa-github-square"></span></a>




 


















</div>


  

</header>


<article id="main-content" class="container main_content single">
  <header class="container hat">
  <h1>Spring
</h1>

</header>

  <div class="container content">
  <h3 id="12spring">1.2Spring的事务管理:</h3>
<h5 id="spring2">spring中支持一下2中事务声明方式</h5>
<ul>
<li>
<ol>
<li>编程式事务  当系统需要明确的，细粒度的控制各个事务的边界，应选择编程式事务</li>
</ol>
</li>
<li>2.声明式事务  当系统对于事务的控制粒度较粗时，应该选择申明式事务</li>
</ul>
<h5 id="121-spring">1.2.1 Spring的事务管理</h5>
<p>JavaEE的开发需要分成三层:</p>
<ul>
<li>事务的开发,事务一般都加在Service层.</li>
</ul>
<h5 id="122-springapi">1.2.2 Spring提供管理事务的API</h5>
<p>PlatformTransactionManager	:平台事务管理器.<br>
|&ndash;获得事务,操作事务.<br>
TransactionDefinition		:事务定义信息:<br>
|&ndash;事务定义信息(隔离、传播、超时、只读)</p>
<h6 id="transactionstatus---">TransactionStatus			:事务状态:</h6>
<p>关系:<br>
PlatformTransactionManager 根据 TransactionDefinition对事务定义的信息管理事务,在管理事务的过程中产生一些状态:由TransactionStatus记录
用来管理事务的真正接口:</p>
<blockquote>
<p>org.springframework.jdbc.datasource.DataSourceTransactionManager	使用Spring JDBC或iBatis 进行持久化数据时使用<br>
org.springframework.orm.hibernate3.HibernateTransactionManager		使用Hibernate3.0版本进行持久化数据时使用<br>
org.springframework.orm.jpa.JpaTransactionManager	使用JPA进行持久化时使用<br>
org.springframework.jdo.JdoTransactionManager	当持久化机制是Jdo时使用<br>
org.springframework.transaction.jta.JtaTransactionManager	使用一个JTA实现来管理事务，在一个事务跨越多个资源时必须使用</p>
</blockquote>
<h6 id="transactiondefinition">TransactionDefinition:</h6>
<p>事务特性:ACID<br>
原子性 一致性 隔离性 持久性. 
隔离性引发安全性问题:<br>
三个读问题:<br>
|&ndash;  脏读:一个事务读到另一个事务未提交数据<br>
|&ndash; 不可重复读:一个事务读到另一个事务 已经提交 update 数据.<br>
|&ndash; 虚读:一个事务读到另一个事务 已经提交 insert 数据.</p>
<h6 id="solationxxx--">SOLATION_XXX		:事务隔离级别.</h6>
<ul>
<li>DEFAULT		:默认的. Mysql:REPEATABLE_READ  Orale:READ_COMMITED</li>
<li>READ_UNCOMMITED	:三种读问题都有可能发生</li>
<li>READ_COMMITED		:避免脏读但是不可重复读和虚读有可能发生</li>
<li>REPEATABLE_READ	:避免脏读,不可重复读但是虚读有可能发生</li>
<li>SERIALIZABLE		:避免事务并发问题.</li>
</ul>
<h6 id="propagionxxx--">PROPAGION_XXX		:事务的传播行为</h6>
<ul>
<li><code>PROPAGATION_REQUIRED</code>		支持当前事务，如果不存在 就新建一个(默认)</li>
</ul>
<ul>
<li>A,B 如果A中有事务,B使用A的事务.如果A没有事务 B就创建一个事务.(A,B是在一个事务中.)</li>
</ul>
<ul>
<li>PROPAGATION_SUPPORTS		支持当前事务，如果不存在，就不使用事务</li>
</ul>
<ul>
<li>A,B 如果A中有事务,B使用A的事务,如果A没有事务 B就不用事务.</li>
</ul>
<ul>
<li>PROPAGATION_MANDATORY	支持当前事务，如果不存在，抛出异常</li>
</ul>
<ul>
<li>A,B 如果A中有事务,B使用A的事务,如果A没有事务 抛出移除</li>
</ul>
<ul>
<li><code>PROPAGATION_REQUIRES_NEW</code>	如果有事务存在，挂起当前事务，创建一个新的事务</li>
</ul>
<ul>
<li>A,B 如果A中有事务,B将A的事务挂起,创建一个新的事务.(A,B没有在一个事务中.)</li>
</ul>
<ul>
<li>PROPAGATION_NOT_SUPPORTED	以非事务方式运行，如果有事务存在，挂起当前事务</li>
</ul>
<ul>
<li>A,B如果A中有事务,B就将A挂起.B不用事务.</li>
</ul>
<ul>
<li>PROPAGATION_NEVER 	以非事务方式运行，如果有事务存在，抛出异常</li>
</ul>
<ul>
<li>A,B如果A有事务 抛出异常</li>
</ul>
<ul>
<li><code>PROPAGATION_NESTED</code>	如果当前事务存在，则嵌套事务执行</li>
</ul>
<ul>
<li>A,B 如果A有事务.执行A的事务.之后将这个设置一个保存点SavePoint.执行B的操作,如果B发生异常.自动回到保存点的位置.用户根据具体需求设置回滚还是提交.</li>
</ul>
<h6 id="heading">区别:</h6>
<ul>
<li>PROPAGATION_REQUIRED		:A,B总在一个事务中.要么一起成功要么一起失败.</li>
<li>PROPAGATION_REQUIRES_NEW:A,B不在一个事务中.</li>
<li>PROPAGATION_NESTED		:嵌套事务,基于SavePoint.</li>
</ul>
<h5 id="123-spring">1.2.3 Spring中事务的操作:</h5>
<ol>
<li>
<p>编程式的事务管理:<br>
* 编写代码的时候完成的事务的管理.</p>
</li>
<li>
<p>声明式的事务管理:<br>
* 通过配置完成对事务管理的操作.</p>
</li>
</ol>
<p>事务
@Transactional(readOnly=true) 只读</p>
<h4 id="heading1">搭建事务转账环境:</h4>
<h6 id="-">步骤一: 建表.</h6>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h6 id="spring">步骤二:搭建Spring开发环境:</h6>
<p>导入6个基本包<br>
配置文件 :<br>
|&ndash; 日志 applicationContext.xml
数据库驱动:<br>
Spring的jdbc操作的包:<br>
C3P0的jar包:<br>
|&ndash; 一个属性文件 :jdbc.properties</p>
<h6 id="daoservice">步骤三:编写dao和service</h6>
<ul>
<li>cn.itcast.spring3.demo1</li>
<li>AccountService</li>
<li>AccountServiceImpl</li>
<li>AccountDao</li>
<li>AccountDaoImpl</li>
</ul>
<h6 id="daoservicespring">步骤四:把DAO和Service交给Spring管理:</h6>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h6 id="daojdbc">步骤五:Dao完成JDBC的操作:</h6>
<ul>
<li>将JdbcTemplate注入给DAO:</li>
</ul>
<ol>
<li>在Dao上继承JdbcDaoSupport类.</li>
<li>将连接池的信息注入给DAO就可以了.</li>
</ol>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h6 id="daoservice1">步骤六:将Dao注入给Service:</h6>
<ol>
<li>在Service类中提供Dao对象,对其提供set方法.</li>
<li>在SPring的配置文件中进行注入</li>
</ol>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h6 id="dao">步骤七:将Dao中的方法实现;</h6>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h6 id="service">步骤八:在Service层完成转账操作:</h6>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h6 id="heading2">步骤九:编写测试:</h6>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<hr>
<hr>
<h2 id="spring--">Spring  注入</h2>
<p>SPEL:Spring expression language(Spring 3.0中提供新的特性:)</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h6 id="heading3">测试类:</h6>
<pre><code>//配置文件为applictionContext.xml时可以不用填
&lt;pre&gt;&lt;code&gt;
ClassPathXmlApplicationContext applicationContext = 
new ClassPathXmlApplicationContext(&quot;xml配置文件&quot;);
</code></pre>
<p><!-- raw HTML omitted --><!-- raw HTML omitted -->
类 变量名=(类型) applicationContext.getBean( &quot; ID值 &quot; );</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>postProcessBeforeInitialization(Object bean, String beanName) 实例化前执行的方法<br>
|&ndash;bean:applicationContext.xml 中bean id<br>
|&ndash;beanName:获取Bean的名称，和封装的数据<br>
postProcessAfterInitialization(Object bean, String beanName) 实例化后执行的方法</p>
<h5 id="bean">Bean的生命周期:</h5>
<p>生命周期:这个类从创建到销毁过程.
|&ndash;通过&lt;bean&gt;标签上init-method和destroy-method指定初始化和销毁执行的方法.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>★ 销毁的方法执行,必须bean是单例的而且关闭工厂.
</code></pre>
<h6 id="ltbeanltbean">&lt;bean&gt;&lt;/bean&gt;</h6>
<ul>
<li>id<br>
-  class<br>
-  scope=&quot;prototype&rdquo;：作用域
<ul>
<li>prototype：每次从容器中调用Bean时，都返回一个新的实例，
即每次调用getBean()时 ，相当于执行new XxxBean()</li>
<li>singleton：在Spring IoC容器中仅存在一个Bean实例，Bean
以单例方式存在</li>
<li>request：每次HTTP请求都会创建一个新的Bean，该作用域仅
适用于WebApplicationContext环境</li>
<li>session：同一个HTTP Session 共享一个Bean，不同Session
使用不同Bean，仅适用于WebApplicationContext 环境</li>
<li>globalSession：一般用于Porlet应用环境，该作用域仅适用
于WebApplicationContext 环境</li>
</ul>
</li>
</ul>
<h6 id="bean11">Bean的完整的生命周期:(提供了11个过程.)</h6>
<ol>
<li>instantiate bean对象实例化</li>
<li>populate properties 封装属性</li>
<li>如果Bean实现BeanNameAware 执行 setBeanName 设置Bean的name</li>
<li>如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象
setApplicationContext</li>
<li>★如果存在类实现 BeanPostProcessor（后处理Bean） ，执行postProcessBeforeInitialization 此方法在类初始
化之前执行</li>
<li>如果Bean实现InitializingBean 执行 afterPropertiesSet 属性设置完成后执行此方法</li>
<li>调用<!-- raw HTML omitted --> 指定初始化方法 init</li>
<li>★如果存在类实现 BeanPostProcessor（后处理Bean） ，执行postProcessAfterInitialization此方法在类初始化
之后执行</li>
<li>执行业务处理</li>
<li>如果Bean实现 DisposableBean 执行 destroy Spring框架提供对象销毁的方法</li>
<li>调用<!-- raw HTML omitted --> 指定销毁方法 customerDestroy
*  第三步和第四步让Bean了解Spring容器.</li>
</ol>
<ul>
<li>★ BeanPostProcessor:工厂勾子.允许用户对其进行扩展.</li>
<li>每个类在实例的时候,后处理Bean都会执行.对这个类进行扩展.</li>
</ul>
<p>|&ndash; 扩展有几种方式?<br>
继承:
装饰者模式:
动态代理:</p>
<p>|&ndash;后处理Bean通常与动态代理一起使用,完成Bean的增强的操作.(Spring中有很多的地方都使用了后处理Bean).<br>
|&ndash;对UserDao中的add方法进行权限校验/时间监控?<br>
|&ndash;Proxy:<br>
static Object newProxyInstance(ClassLoader classLoader,Class[] interfaces,InvocationHandler h);</p>
<h5 id="xml">（XML）注入</h5>
<pre><code>&lt;bean&gt;中如果没有加ID表示这个类是Spring框架内部使用的类  
示例：&amp;lt;!-- 后处理Bean的配置 --&gt;  
    &lt;bean class=&quot;类完整限定名&quot;&gt;&lt;/bean&gt;  
每个Bean实例化都会执行后处理Bean  
</code></pre>
<h6 id="springset">Spring只支持构造方法注入和Set方法注入</h6>
<ol>
<li>构造方法注入</li>
</ol>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<ol start="2">
<li>set方法注入</li>
</ol>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>  **注**： value注入的是普通属性.ref注入的是依赖的其他Bean.  
</code></pre>
<h6 id="sqel">SqEL注入</h6>
<p><strong>语法:</strong><br>
#{SqEL}</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>   **注**：引用类型要一至
</code></pre>
<h6 id="p">名称空间p的注入:</h6>
<pre><code>**简化属性的注入:**
* 如果类中有很多的属性,那么需要配置很多的&lt;property&gt;标签,那么这样的话,就会比较麻烦.
Spring2.5版本以后提供名称空间p的注入形式:
* 语法:
* p:属性名=”值”
* p:属性名-ref=”对象”

引入
xmlns:p=&quot;http://www.springframework.org/schema/p&quot;

使用名称空间p之后:
&lt;bean id=&quot;person&quot; class=&quot;cn.itcast.spring3.demo5.Person&quot; p:属性名1=&quot;值&quot; p:属性名1=&quot;值&quot;&gt;&lt;/bean&gt;

|--注入集合属性:  
    List：
     &lt;property name=&quot;list&quot;&gt;
        &lt;list&gt;
            &lt;value&gt;宝马&lt;/value&gt;
            &lt;value&gt;奔驰&lt;/value&gt;
        &lt;/list&gt;
    &lt;/property&gt;

    Set：
    &lt;property name=&quot;set&quot;&gt;
        &lt;set&gt;
            &lt;value&gt;刘跃东&lt;/value&gt;
            &lt;value&gt;梁桐&lt;/value&gt;
        &lt;/set&gt;
    &lt;/property&gt;

    Map：
    &lt;property name=&quot;map&quot;&gt;
        &lt;map&gt;
            &lt;entry key=&quot;刘跃东&quot; value=&quot;250&quot;/&gt;
            &lt;entry key=&quot;梁同&quot; value=&quot;380&quot;/&gt;
        &lt;/map&gt;
    &lt;/property&gt;

    Properties：
    &lt;property name=&quot;properties&quot;&gt;
        &lt;props&gt;
            &lt;prop key=&quot;刘跃东&quot;&gt;250&lt;/prop&gt;
            &lt;prop key=&quot;梁同&quot;&gt;380&lt;/prop&gt;
        &lt;/props&gt;
    &lt;/property&gt;


|--Spring支持多文件的配置:  
第一种方式:
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext							(&quot;bean1.xml&quot;,&quot;bean2.xml&quot;);

第二种方式:
&lt;import resource=&quot;classpath:applicationContext2.xml&quot;/&gt;
</code></pre>
<h6 id="heading4">测试</h6>
<p>|&ndash;Spring整合JUnit单元测试:<br>
步骤一:工程中有Junit的开发环境.<br>
步骤二:导入spring-test-3.2.0.RELEASE.jar<br>
步骤三:在测试类中添加注解:<br>
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(&ldquo;classpath:applicationContext.xml&rdquo;)
public class SpringTest1 {</p>
<pre><code>@Autowired
@Qualifier(&quot;userService&quot;)
private UserService userService; 

@Test
public void demo1(){
    userService.add();
}
}
</code></pre>
<h6 id="heading5">（注解）注入</h6>
<p>|&ndash;引入一个context的头约束:<br>
<!-- raw HTML omitted --></p>
<p>|&ndash;配置spring框架扫描的包:<br>
<!-- raw HTML omitted -->
&lt;context:component-scan base-package=&quot;cn.itcast.spring3.demo1&rdquo;/&gt;</p>
<p>|&ndash;提供了@Component的三个衍生注解:<br>
理解：注解类的，向外界提供操作该类的一个入口
web层:@Controller
业务层:@Service
DAO层:@Repository</p>
<pre><code>为了好区分不同层
</code></pre>
<h6 id="heading6">对象属性:</h6>
<pre><code>理解：@注解(value值去匹配Spring配置文件中的beanID，默认匹配方法名小写的名字)
</code></pre>
<p>|&ndash; @Autowired的注解:<br>
@Autowired<br>
private UserDao userDao;</p>
<pre><code> @Autowired注解:默认按类型装配.  
 示例：@Autowired  
    public UserDao userDao;  
    对应同一个文件中的@Component或其衍生注解所修饰的类如下（？对应类的范围不太清楚）  
	
    @Repository  
    public void UserDao(){}  

 @Qualifier注解和@Autowired注解组合使用 按名称进行装配.  
 示例：  
    @Autowired  
    @Qualifier(&quot;userDao&quot;)；  
    private UserDao userDao;  
	
    同上  
    @Repository(&quot;userDao&quot;)  
    public void UserDao(){}  

理解：作用于类的类部，装配类  

★ 注解的属性的注入:可以没有set方法. @Value/@Autowired 注解可以修饰成员变量,修  
   饰set方法.如果修饰了成员变量,可以不用提供set方法.  

注：@Autowired(required=false);  
required=false忽略异常继续向下执行  

|--Sprin提供了对JSR-250(标准)的支持:  

    按名称进行装配.  
    @Resource(name=&quot;userDao&quot;)  
    相当于  
    @Autowired  
    @Qualifer(“userDao”)  
    是等价的  
</code></pre>
<p>|&ndash;Bean的生命周期注解:<br>
@PostConstruct	        相当于<!-- raw HTML omitted -->初始化<br>
@PreDestroy		相当于<!-- raw HTML omitted -->销毁</p>
<p>|&ndash;Bean的作用范围:<br>
在类上添加一个注解:<br>
@Scope(“prototype”)单例的</p>
<p>|&ndash;Spring3.0以JavaConfig为核心，提供使用Java类定义Bean信息的方法(很少使用)</p>
<p>JavaConfig:用一个Jave类作为一个配置.</p>
<p>定义一个类:让这个类作为配置(工厂)
@Configuration
public class BeanConfig {</p>
<pre><code>@Bean(name=&quot;car&quot;)
public Car showCar(){
    Car car = new Car();
    car.setName(&quot;保时捷&quot;);
    car.setPrice(2000000);
    return car;
}

@Bean(name=&quot;product&quot;)
public Product showProduct(){
    Product product = new Product();
    product.setName(&quot;空调&quot;);
    product.setPrice(2000);
    return product;
}
</code></pre>
<p>}</p>
<p>让Spring框架可以扫描到注解:
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(&ldquo;xml配置文件&rdquo;);
Car car=(Car) applicationContext.getBean(&ldquo;car&rdquo;);
Product product=(Product) applicationContext.getBean(&ldquo;product&rdquo;);</p>
<h6 id="springweb">Spring整合Web</h6>
<p>在Servlet中编写如下代码:
public class extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {</p>
<pre><code>    ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
            &quot;applicationContext.xml&quot;);
    UserService userService = (UserService) applicationContext.getBean(&quot;userService&quot;);
    userService.add();
}
public void doPost(HttpServletRequest request, HttpServletResponse response){}
</code></pre>
<p>}
|&ndash;发现一个问题:
每次执行Servlet的时候,都会创建一个Spring的工厂(加载Spring的环境.)只需要加载一次就可以了!!!
|&ndash;解决方案一:可以把加载Spring的环境的代码放到Servlet的init方法中.
一个Servlet中可以使用没有问题的,如果有很多的Servlet.</p>
<pre><code>|--解决方案二:ServletContext.全局对象.服务器启动的时候创建.
    将Spring的工厂放到ServletContext中.
    ServletContextListener:监听ServletContext对象的创建和销毁.
</code></pre>
<p>|&ndash;提供的实现包:
引入:spring-web-3.2.0.RELEASE.jar
|&ndash;配置监听器:
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->org.springframework.web.context.ContextLoaderListener<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
注：这个监听器默认加载WEB-INF下applicationContext.xml而我们的applicationContext.xml在
WEB-INF下的class目录下(ContextLoader)因此需要配置全局初始化参数。如下</p>
<p>|&ndash; 配置全局初始化参数:
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->contextConfigLocation<!-- raw HTML omitted -->
<!-- raw HTML omitted -->classpath:applicationContext.xml<!-- raw HTML omitted -->
<!-- raw HTML omitted --></p>
<p>|&ndash; 改写Servlet:
第一种方式:
WebApplicationContext applicationContext =
WebApplicationContextUtils.getWebApplicationContext	(getServletContext());</p>
<pre><code>另一种方式:
WebApplicationContext applicationContext = 
    (WebApplicationContext)getServletContext()
    .getAttribute(WebApplicationContext
    .ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);


### 事务传播级别隔离级别以及高并发下的应用经验 
</code></pre>

</div>


  
</article>
      <footer id="main-footer" class="container main_footer">
  

  <div class="container nav foot no-print">
  
<a href="https://lvzongcheng.gitee.io/license">license</a>


  <a class="toplink" href="#">back to top</a>

</div>

  <div class="container credits">
  
<div class="container footline">
  
  code with <!-- raw HTML omitted --><!-- raw HTML omitted -->


</div>


  
<div class="container copyright">
  
  (c) 2015 yourname.


</div>


</div>

</footer>

    </main>
    
<script type="text/javascript">
  (function() {
    
    
    if (window.location.hostname == "localhost")
      return;
    var dsq = document.createElement('script'); dsq.async = true; dsq.type = 'text/javascript';
    dsq.src = '//your_disqus_shortname.disqus.com/count.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
  })();
</script>



<script src="/js/highlight.pack.js"></script>
<script>hljs.initHighlightingOnLoad();</script>



    
  </body>
</html>

